#include <iostream>
using namespace std;
class date
{
public:
    int _year;
    int *y;

public:
    void print()
    {
        printf("%d \n", _year);
    }
    //构造函数
    date(int year = 1, int num = 10)
    {
        _year = year;
        y = &num;
    }
    //拷贝构造函数
    date(const date &d)
    {
        _year = d._year;
        y = d.y;
    }
    //析构函数
    ~date()
    {
        if (y != nullptr)
        {
            free(y);
        }
        else
        {
            y = nullptr;
        }
        cout << this << "~date()" << endl;
    }
};
int main()
{
    // 1.浅拷贝,就是d1是多少字节，多少东西，我d2也有
    // date d1(2023);
    // date d2(d1);
    //这样就会面临一个问题对于指针类型的成员变量，拷贝构造函数会复制指针的值，使得新对象指向与原对象相同的内存块。
    //这会导致新对象和原对象共享同一块内存，从而可能引发问题。这种情况下，新对象和原对象的指针都指向同一块内存地址，
    //会导致浅拷贝问题，当其中一个对象释放内存后，另一个对象的指针将变成悬空指针，所以要使用深拷贝

    // 2.下面就是浅拷贝报错
    date d1(20, 20);
    date d2(d1);
    //按照析构的顺序，d2已经把内存给析构了,之后d1已经是悬空指针，在次析构d1会崩溃
    //需要用new&delete一起早堆区开辟内存，使他们在两个不同的内存块

    //总结：需要用到自定义的析构函数的或者存在指针变量的一般都是使用深拷贝
    //单纯的没用指针变量的类，或者不需要写析构函数的类就能使用，那么浅拷贝就够用

    return 0;
}